package com.donfu.system.service.house.impl;

import java.util.*;

import com.donfu.system.domain.dto.HouseProductTypeDTO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.donfu.system.mapper.house.HouseProductTypeMapper;
import com.donfu.system.domain.house.HouseProductType;
import com.donfu.system.service.house.IHouseProductTypeService;

/**
 * 产品类型Service业务层处理
 *
 * @author donfu
 * @date 2021-12-01
 */
@Service
public class HouseProductTypeServiceImpl implements IHouseProductTypeService {
    @Autowired
    private HouseProductTypeMapper houseProductTypeMapper;

    /**
     * 查询产品类型
     *
     * @param id 产品类型主键
     * @return 产品类型
     */
    @Override
    public HouseProductType selectHouseProductTypeById(Long id) {
        return houseProductTypeMapper.selectHouseProductTypeById(id);
    }

    /**
     * 查询产品类型列表
     *
     * @param houseProductType 产品类型
     * @return 产品类型
     */
    @Override
    public List<HouseProductType> selectHouseProductTypeList(HouseProductType houseProductType) {
        return houseProductTypeMapper.selectHouseProductTypeList(houseProductType);
    }

    /**
     * 查询产品一级类型列表
     *
     * @param
     * @return 产品类型
     */
    @Override
    public List<Map<String, Object>> selectHouseProductTypePName() {
        return houseProductTypeMapper.selectHouseProductTypePName();
    }

    /**
     * 查询商品分类以树形结构返回
     *
     * @return
     */
    public List<HouseProductTypeDTO> getProductTypeTree() {
        // 1.查询出所有的分类
        List<HouseProductTypeDTO> allProductTypes = houseProductTypeMapper.getProductTypeTree();

        // 2.组装成父子的树形结构
        List<HouseProductTypeDTO> level1Menus = new ArrayList<>();
        // 遍历所有分类
        for (HouseProductTypeDTO productTypeDTO : allProductTypes) {
            // 找到所有的一级分类
            if (productTypeDTO.getPid() == 0){
                level1Menus.add(productTypeDTO);
            }
        }

        // 通过父级分类查找父级下所有子分类,然后将其添加到父类对象的子类集合中
        for (HouseProductTypeDTO level1Menu : level1Menus) {
            level1Menu.setChildren(getChildrens(level1Menu,allProductTypes));
        }

        //排序
        level1Menus.sort(new Comparator<HouseProductTypeDTO>() {
            @Override
            public int compare(HouseProductTypeDTO o1, HouseProductTypeDTO o2) {
                return (int) ((o1.getSort() == null ? 0 : o1.getSort()) - (o2.getSort() == null ? 0 : o2.getSort()));
            }
        });

        return level1Menus;
    }

    /**
     * 递归查找所有的下级分类
     * 在这一级别的分类中找下级分类
     *
     * @param root 当前级别的分类
     * @param all  全部分类
     * @return 下一级分类
     */
    private List<HouseProductTypeDTO> getChildrens(HouseProductTypeDTO root, List<HouseProductTypeDTO> all) {
        List<HouseProductTypeDTO> children = new ArrayList<>();
        for (HouseProductTypeDTO a : all) {
            if (a.getPid().equals(root.getId())) {
                a.setChildren(getChildrens(a, all));
                children.add(a);
            }
        }
        children.sort(new Comparator<HouseProductTypeDTO>() {
            @Override
            public int compare(HouseProductTypeDTO o1, HouseProductTypeDTO o2) {
                return (int) ((o1.getSort() == null ? 0 : o1.getSort()) - (o2.getSort() == null ? 0 : o2.getSort()));
            }
        });
        return children;
    }

    /**
     * 新增产品类型
     *
     * @param houseProductType 产品类型
     * @return 结果
     */
    @Override
    public int insertHouseProductType(HouseProductType houseProductType) {
        houseProductType.setCreateDate(new Date());
        return houseProductTypeMapper.insertHouseProductType(houseProductType);
    }

    /**
     * 修改产品类型
     *
     * @param houseProductType 产品类型
     * @return 结果
     */
    @Override
    public int updateHouseProductType(HouseProductType houseProductType) {
        houseProductType.setUpdateDate(new Date());
        return houseProductTypeMapper.updateHouseProductType(houseProductType);
    }

    /**
     * 批量删除产品类型
     *
     * @param ids 需要删除的产品类型主键
     * @return 结果
     */
    @Override
    public int deleteHouseProductTypeByIds(Long[] ids) {
        return houseProductTypeMapper.deleteHouseProductTypeByIds(ids);
    }

    /**
     * 删除产品类型信息
     *
     * @param id 产品类型主键
     * @return 结果
     */
    @Override
    public int deleteHouseProductTypeById(Long id) {
        return houseProductTypeMapper.deleteHouseProductTypeById(id);
    }
}
